package juanca.mole;

import java.sql.Time;
import java.text.SimpleDateFormat;

import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;
import org.json.JSONObject;

import ClasesExtras.GetIpAddress;
import ClasesExtras.ManejadorCampos;
import ClasesExtras.ValidacionCampos;
import ClasesExtras.handlerAlertMessage;
import ClasesExtras.handlerDb;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.app.ProgressDialog;
import android.app.TimePickerDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.view.WindowManager;
import android.widget.EditText;
import android.widget.RadioButton;
import android.widget.TimePicker;
import android.widget.Toast;

public class CheqFQ_Traza extends Activity {

	private int hMinuto;
	private int hHora;
	private boolean color;
	private boolean olor;
	private boolean sabor;
	private boolean textura;
	private String obsColor;
	private String obsOlor;
	private String obsSabor;
	private String obsTextura;
	private double medPh;
	private double consistencia;
	private double acidez;
	private double brix;
	private double tempoMezcla;
	public Time tiempoMezcla;
	public ValidacionCampos validarcampos = new ValidacionCampos();
	public handlerDb handlerdb = new handlerDb(this);
	public String proceso;
	public CheqFQ_Traza self = this;
	public String parametrerdateElabora;
	public String parametrerdateVenc;
	public String parametrertemp_fin;
	public String parametrerobs;
	public Bundle b = new Bundle();
	public ProgressDialog progressDialog;

	public static final int TIME_DIALOG_ID = 1;
	public static final String STRING_EMPTY = "";
	public String URL_CHEQUEOS_FISICO_QUIMICO;

	private EditText etMedPhTraza;
	private EditText etConsisTraza;
	private EditText etAcidezTraza;
	private EditText etBrixtraza;
	private EditText etTempMezclaTraza;

	private EditText etObsPre1Traza;
	private EditText etObsPre2Traza;
	private EditText etObsPre3Traza;
	private EditText etObsPre4Traza;
	private RadioButton rbSiResPre1Traza;
	private RadioButton rbNoResPre1Traza;
	private RadioButton rbSiResPre2Traza;
	private RadioButton rbNoResPre2Traza;
	private RadioButton rbSiResPre3Traza;
	private RadioButton rbNoResPre3Traza;
	private RadioButton rbSiResPre4Traza;
	private RadioButton rbNoResPre4Traza;
	private ManejadorCampos manejador;
	private handlerAlertMessage manejadorMensajes;
	private Activity activity;

	/**
	 * @return the tempoMezcla
	 */
	public double getTempoMezcla() {
		return tempoMezcla;
	}

	/**
	 * @param tempoMezcla
	 *            the tempoMezcla to set
	 */
	public void setTempoMezcla(double tempoMezcla) {
		this.tempoMezcla = tempoMezcla;
	}

	/**
	 * @return the brix
	 */
	public Time getTiempoMezcla() {
		return tiempoMezcla;
	}

	/**
	 * @param brix
	 *            the brix to set
	 */
	public void setTiempoMezcla(Time tiempoMezcla) {
		this.tiempoMezcla = tiempoMezcla;
	}

	/**
	 * @return the brix
	 */
	public double getBrix() {
		return brix;
	}

	/**
	 * @param brix
	 *            the brix to set
	 */
	public void setBrix(double brix) {
		this.brix = brix;
	}

	/**
	 * @return the acidez
	 */
	public double getAcidez() {
		return acidez;
	}

	/**
	 * @param acidez
	 *            the acidez to set
	 */
	public void setAcidez(double acidez) {
		this.acidez = acidez;
	}

	/**
	 * @return the consistencia
	 */
	public double getConsistencia() {
		return consistencia;
	}

	/**
	 * @param consistencia
	 *            the consistencia to set
	 */
	public void setConsistencia(double consistencia) {
		this.consistencia = consistencia;
	}

	/**
	 * @return the medPh
	 */
	public double getMedPh() {
		return medPh;
	}

	/**
	 * @param medPh
	 *            the medPh to set
	 */
	public void setMedPh(double medPh) {
		this.medPh = medPh;
	}

	/**
	 * @return the obsTextura
	 */
	public String getObsTextura() {
		return obsTextura;
	}

	/**
	 * @param obsTextura
	 *            the obsTextura to set
	 */
	public void setObsTextura(String obsTextura) {
		this.obsTextura = obsTextura;
	}

	/**
	 * @return the obsSabor
	 */
	public String getObsSabor() {
		return obsSabor;
	}

	/**
	 * @param obsSabor
	 *            the obsSabor to set
	 */
	public void setObsSabor(String obsSabor) {
		this.obsSabor = obsSabor;
	}

	/**
	 * @return the obsOlor
	 */
	public String getObsOlor() {
		return obsOlor;
	}

	/**
	 * @param obsOlor
	 *            the obsOlor to set
	 */
	public void setObsOlor(String obsOlor) {
		this.obsOlor = obsOlor;
	}

	/**
	 * @return the obsColor
	 */
	public String getObsColor() {
		return obsColor;
	}

	/**
	 * @param obsColor
	 *            the obsColor to set
	 */
	public void setObsColor(String obsColor) {
		this.obsColor = obsColor;
	}

	/**
	 * @return the textura
	 */
	public boolean isTextura() {
		return textura;
	}

	/**
	 * @param textura
	 *            the textura to set
	 */
	public void setTextura(boolean textura) {
		this.textura = textura;
	}

	/**
	 * @return the sabor
	 */
	public boolean isSabor() {
		return sabor;
	}

	/**
	 * @param sabor
	 *            the sabor to set
	 */
	public void setSabor(boolean sabor) {
		this.sabor = sabor;
	}

	/**
	 * @return the olor
	 */
	public boolean isOlor() {
		return olor;
	}

	/**
	 * @param olor
	 *            the olor to set
	 */
	public void setOlor(boolean olor) {
		this.olor = olor;
	}

	/**
	 * @return the color
	 */
	public boolean isColor() {
		return color;
	}

	/**
	 * @param color
	 *            the color to set
	 */
	public void setColor(boolean color) {
		this.color = color;
	}

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.layout_cheq_fq__traza);

		getWindow().setSoftInputMode(
				WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);

		etMedPhTraza = (EditText) findViewById(R.id.etMedPhTraza);
		etConsisTraza = (EditText) findViewById(R.id.etConsisTraza);
		etAcidezTraza = (EditText) findViewById(R.id.etAcidezTraza);
		etBrixtraza = (EditText) findViewById(R.id.etBrixtraza);
		etTempMezclaTraza = (EditText) findViewById(R.id.etTempMezclaTraza);
		etObsPre1Traza = (EditText) findViewById(R.id.etObsPre1Traza);
		etObsPre2Traza = (EditText) findViewById(R.id.etObsPre2Traza);
		etObsPre3Traza = (EditText) findViewById(R.id.etObsPre3Traza);
		etObsPre4Traza = (EditText) findViewById(R.id.etObsPre4Traza);
		rbSiResPre1Traza = (RadioButton) findViewById(R.id.rbSiResPre1Traza);
		rbNoResPre1Traza = (RadioButton) findViewById(R.id.rbNoResPre1Traza);
		rbSiResPre2Traza = (RadioButton) findViewById(R.id.rbSiResPre2Traza);
		rbNoResPre2Traza = (RadioButton) findViewById(R.id.rbNoResPre2Traza);
		rbSiResPre3Traza = (RadioButton) findViewById(R.id.rbSiResPre3Traza);
		rbNoResPre3Traza = (RadioButton) findViewById(R.id.rbNoResPre3Traza);
		rbSiResPre4Traza = (RadioButton) findViewById(R.id.rbSiResPre4Traza);
		rbNoResPre4Traza = (RadioButton) findViewById(R.id.rbNoResPre4Traza);
		manejadorMensajes = new handlerAlertMessage();
		manejador = new ManejadorCampos();
		activity = this;

	}

	@Override
	protected void onStart() {
		super.onStart();

		handlerDb db = new handlerDb(this);
		db.abrir();
		if (db.leerTabla4("actividad").equals("new")) {
			this.setTitle(this
					.getString(R.string.title_activity_cheq_fq__traza)
					+ ". ("
					+ this.getString(R.string.msjDatosProcesoNumLote)
					+ ": "
					+ db.leer("nombre_lote")
					+ ", "
					+ this.getString(R.string.msjDatosProcesoProducto)
					+ ": "
					+ db.leer("nombre_producto") + ")");

		} else {
			this.setTitle(this
					.getString(R.string.title_activity_cheq_fq__traza)
					+ ". ("
					+ this.getString(R.string.msjDatosProcesoNumLote)
					+ ": "
					+ db.leerTabla2("nombre_lote")
					+ ", "
					+ this.getString(R.string.msjDatosProcesoProducto)
					+ ": "
					+ db.leerTabla2("nombre_producto") + ")");
		}
		GetIpAddress direccion = new GetIpAddress(this);

		if (direccion.getDireccion() != null) {
			URL_CHEQUEOS_FISICO_QUIMICO = direccion.getDireccion()
					+ "/chequeos_fisicoquimico.json";

		} else {
			new AlertDialog.Builder(this)
					.setIcon(android.R.drawable.ic_dialog_alert)
					.setTitle(R.string.tituloAlerta)
					.setMessage(R.string.msjErSinDireccion)
					.setPositiveButton(R.string.btnAceptar,
							new DialogInterface.OnClickListener() {// un
								// listener que al pulsar, cierre la
								// aplicacion
								@Override
								public void onClick(DialogInterface dialog,
										int which) {
									// Salir
									Intent intent = new Intent();
									intent.setClass(activity, Etapas.class);
									startActivity(intent);
								}
							}).show();
		}

	}

	@Override
	protected void onResume() {
		super.onResume();

		b = this.getIntent().getBundleExtra("estado");
		this.parametrerdateElabora = b.getString("dateElabora");
		this.parametrerdateVenc = b.getString("dateVenc");
		this.parametrertemp_fin = b.getString("temp_fin");
		this.parametrerobs = b.getString("obs");

	}

	@SuppressWarnings("deprecation")
	public void tiemMezcla(View v) {
		showDialog(TIME_DIALOG_ID);

	}

	@SuppressLint("SimpleDateFormat")
	private TimePickerDialog.OnTimeSetListener showtime = new TimePickerDialog.OnTimeSetListener() {

		@SuppressLint("SimpleDateFormat")
		@Override
		public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
			hHora = hourOfDay;
			hMinuto = minute;

			Context context = getApplicationContext();
			CharSequence text = new StringBuilder().append(hHora).append(":")
					.append(hMinuto);
			int duration = Toast.LENGTH_SHORT;

			Toast toast = Toast.makeText(context, text, duration);
			toast.show();

			SimpleDateFormat formatoTiempo = new SimpleDateFormat("hh:mm");
			String time = (hHora + ":" + hMinuto).toString();

			try {
				Time tiempo = new Time(formatoTiempo.parse(time).getTime());
				setTiempoMezcla(tiempo);

			} catch (java.text.ParseException e) {
				manejadorMensajes.alertMessageOneButton(activity,
						R.string.tituloError, R.string.msjERHoraUsuario,
						R.string.btnAceptar);

			}

		}
	};

	@Override
	protected Dialog onCreateDialog(int id) {
		switch (id) {
		case TIME_DIALOG_ID:
			return new TimePickerDialog(this, showtime, hHora, hMinuto, true);
		}
		return null;
	}

	// metodo de radiobutton pre1
	public void ifResPre1Traza(View v) {
		// Is the button now checked?
		boolean checked = ((RadioButton) v).isChecked();

		// Check which radio button was clicked

		switch (v.getId()) {
		case R.id.rbSiResPre1Traza:
			if (checked) {

				this.setColor(checked);

			}
			break;
		case R.id.rbNoResPre1Traza:
			if (checked) {
				this.setColor(!checked);

			}
			break;

		}
	}

	// metodo de radiobutton pre2
	public void ifResPre2Traza(View v) {
		// Is the button now checked?
		boolean checked = ((RadioButton) v).isChecked();

		// Check which radio button was clicked

		switch (v.getId()) {
		case R.id.rbSiResPre2Traza:
			if (checked) {

				this.setOlor(checked);

			}
			break;
		case R.id.rbNoResPre2Traza:
			if (checked) {
				this.setOlor(!checked);

			}
			break;

		}
	}

	// metodo de radiobutton pre3
	public void ifResPre3Traza(View v) {
		// Is the button now checked?
		boolean checked = ((RadioButton) v).isChecked();

		// Check which radio button was clicked

		switch (v.getId()) {
		case R.id.rbSiResPre3Traza:
			if (checked) {

				this.setSabor(checked);

			}
			break;
		case R.id.rbNoResPre2Traza:
			if (checked) {
				this.setSabor(!checked);

			}
			break;

		}
	}

	// metodo de radiobutton pre4
	public void ifResPre4Traza(View v) {
		// Is the button now checked?
		boolean checked = ((RadioButton) v).isChecked();

		// Check which radio button was clicked

		switch (v.getId()) {
		case R.id.rbSiResPre4Traza:
			if (checked) {

				this.setTextura(checked);

			}
			break;
		case R.id.rbNoResPre4Traza:
			if (checked) {
				this.setTextura(!checked);

			}
			break;

		}
	}

	// valida que los campos no esten vacios
	public void finalizarChequeoFQ(View v) {
		int medPh = manejador.validarPeso(etMedPhTraza);
		int consist = manejador.numCanastillas(etConsisTraza);
		int acidez = manejador.valoresEnteros(etAcidezTraza);
		int brix = manejador.validarPh(etBrixtraza);
		int tiempo = manejador.validarPh(etTempMezclaTraza);

		Log.i("CheqFQ_Traza", "medPh= " + medPh);
		Log.i("CheqFQ_Traza", "consist= " + consist);
		Log.i("CheqFQ_Traza", "acidez= " + acidez);
		Log.i("CheqFQ_Traza", "brix= " + brix);
		Log.i("CheqFQ_Traza", "tiempo= " + tiempo);

		if (medPh != 0) {
			switch (medPh) {
			case 2:
				manejadorMensajes.alertMessageOneButton(activity,
						R.string.tituloAlerta, R.string.msjMedicPhVac,
						R.string.btnAceptar);

				break;
			}
		} else {
			if (consist != 0) {
				switch (consist) {
				case 5:
					manejadorMensajes.alertMessageOneButton(activity,
							R.string.tituloAlerta, R.string.msjConsVacio,
							R.string.btnAceptar);

					break;
				}
			} else {
				if (acidez != 0) {
					switch (acidez) {
					case 13:
						manejadorMensajes.alertMessageOneButton(activity,
								R.string.tituloAlerta, R.string.msjAcidVacio,
								R.string.btnAceptar);
						break;
					}
				} else {
					if (brix != 0) {
						switch (brix) {
						case 17:
							manejadorMensajes.alertMessageOneButton(activity,
									R.string.tituloAlerta,
									R.string.msjBrixVacio, R.string.btnAceptar);
							break;
						}
					} else {
						if (tiempo != 0) {
							switch (tiempo) {
							case 17:
								manejadorMensajes.alertMessageOneButton(
										activity, R.string.tituloAlerta,
										R.string.msjBrixVacio,
										R.string.btnAceptar);
								break;
							}
						} else {

							this.validar();
						}

					}
				}
			}
		}

	}

	public void validar() {
		Log.i("Cehqueo_Traza", "entra a validar");
		if (this.rbNoResPre1Traza.isChecked()
				|| this.rbSiResPre1Traza.isChecked()) {

			if (this.rbSiResPre2Traza.isChecked()
					|| this.rbNoResPre2Traza.isChecked()) {

				if (this.rbNoResPre3Traza.isChecked()
						|| this.rbSiResPre3Traza.isChecked()) {

					if (this.rbSiResPre4Traza.isChecked()
							|| this.rbNoResPre4Traza.isChecked()) {

						if (this.getTiempoMezcla() != null) {
							Log.i("Cehqueo_Traza",
									"entra a validar, y cumple con todo");

							if (!this.etObsPre1Traza.getText().toString()
									.equals(STRING_EMPTY)) {
								String ObsPre1Traza = this.etObsPre1Traza
										.getText().toString();
								ObsPre1Traza = this.validarcampos
										.DeleteAccents(ObsPre1Traza);
								this.setObsColor(ObsPre1Traza);
							}

							if (!this.etObsPre2Traza.getText().toString()
									.equals(STRING_EMPTY)) {
								String ObsPre2Traza = this.etObsPre2Traza
										.getText().toString();
								ObsPre2Traza = this.validarcampos
										.DeleteAccents(ObsPre2Traza);
								this.setObsOlor(ObsPre2Traza);
							}

							if (!this.etObsPre3Traza.getText().toString()
									.equals(STRING_EMPTY)) {
								String ObsPre3Traza = this.etObsPre3Traza
										.getText().toString();
								ObsPre3Traza = this.validarcampos
										.DeleteAccents(ObsPre3Traza);
								this.setObsSabor(ObsPre3Traza);
							}

							if (!this.etObsPre4Traza.getText().toString()
									.equals(STRING_EMPTY)) {
								String ObsPre4Traza = this.etObsPre4Traza
										.getText().toString();
								ObsPre4Traza = this.validarcampos
										.DeleteAccents(ObsPre4Traza);
								this.setObsTextura(ObsPre4Traza);
							}

							this.setMedPh(Double.parseDouble(this.etMedPhTraza
									.getText().toString()));
							this.setConsistencia(Double
									.parseDouble(this.etConsisTraza.getText()
											.toString()));
							this.setAcidez(Double
									.parseDouble(this.etAcidezTraza.getText()
											.toString()));
							this.setBrix(Double.parseDouble(this.etBrixtraza
									.getText().toString()));

							this.setTempoMezcla(Double
									.parseDouble(this.etTempMezclaTraza
											.getText().toString()));

							progressDialog = new ProgressDialog(self);
							progressDialog.setMessage(self
									.getString(R.string.PbMsjRegistrando));
							progressDialog.setCancelable(true);
							progressDialog.show();

							new Thread(new Runnable() {
								@Override
								public void run() {
									Log.i("Cehqueo_Traza",
											"entra envio de datos");
									self.enviarDatos();
								}
							}).start();

						} else {
							// seleccione el tiempo de Mezclado
							manejadorMensajes.alertMessageOneButton(activity,
									R.string.tituloAlerta,
									R.string.msjTiempoMezcla,
									R.string.btnAceptar);
						}
					} else {
						// seleccione el textura
						manejadorMensajes.alertMessageOneButton(activity,
								R.string.tituloAlerta, R.string.msjTextura,
								R.string.btnAceptar);
					}

				} else {
					// selecione el sabor
					manejadorMensajes.alertMessageOneButton(activity,
							R.string.tituloAlerta, R.string.msjSabor,
							R.string.btnAceptar);
				}
			} else {
				// seleccione el olor
				manejadorMensajes.alertMessageOneButton(activity,
						R.string.tituloAlerta, R.string.msjOlor,
						R.string.btnAceptar);
			}

		} else {
			// selecione el color
			manejadorMensajes.alertMessageOneButton(activity,
					R.string.tituloAlerta, R.string.msjColor,
					R.string.btnAceptar);
		}

	}

	public void enviarDatos() {
		HttpClient httpClient = new DefaultHttpClient();
		HttpPost post = new HttpPost(URL_CHEQUEOS_FISICO_QUIMICO);

		handlerDb dataBase = new handlerDb(this);
		dataBase.abrir();
		String IdProceso = dataBase.leer("id_proceso");
		String IdProcesoTablas2 = dataBase.leerTabla2("id_proceso");
		try {

			Log.i("Cehqueo_Traza", "entra al Try de envio de datos");
			JSONObject dato = new JSONObject();
			dato.put("color", this.isColor());
			dato.put("olor", this.isOlor());
			dato.put("sabor", this.isSabor());
			dato.put("textura", this.isTextura());
			dato.put("acidez", this.getAcidez());
			dato.put("brix", this.getBrix());
			dato.put("consistencia", this.getConsistencia());
			dato.put("medicion_ph", this.getMedPh());
			dato.put("temp_mezclado", this.getTempoMezcla());
			dato.put("tiempo_mezclado", this.getTiempoMezcla());
			Log.i("Cehqueo_Traza", "antes del if de proceso nuevo o viejo");
			if (dataBase.leerTabla4("actividad").equals("old")) {
				dato.put("proceso_id", IdProcesoTablas2);
				proceso = IdProcesoTablas2;

				Log.i("Cehqueo_Traza", "toma proceso antiguo");
			} else {
				if (dataBase.leerTabla4("actividad").equals("new")) {
					dato.put("proceso_id", IdProceso);
					proceso = IdProceso;
					Log.i("Cehqueo_Traza", "toma proceso nuevo");
				}

			}

			StringEntity entity = new StringEntity(dato.toString());
			post.setHeader("Content-Type", "application/json; chartset=UTF-8");
			post.setEntity(entity);
			HttpResponse resp = httpClient.execute(post);
			final String respStr = EntityUtils.toString(resp.getEntity());
			Log.w("Cehqueo_Traza", respStr);

			if (respStr.equals("true")) {
				Log.i("Cehqueo_Traza", "el servidor me retorno true");
				Log.e("Cehqueo_Traza", "esta antes del hilo de msj exitoso");

				handlerdb.abrir();
				if (handlerdb.leerTabla5("chequeo").equals("false")) {
					int resDbTb5 = handlerdb.eliminarTabla5();
					if (resDbTb5 == 1) {
						handlerdb.registrarTabla5("true");
					}
				}
				handlerdb.cerrar();

				// mensaje de respuesta del servidor
				runOnUiThread(new Runnable() {
					public void run() {

						progressDialog.dismiss();
						Intent intent = new Intent();
						intent.setClass(self, Trazabilidad.class);
						b = new Bundle();
						b.putString("dateElabora", self.parametrerdateElabora);
						b.putString("dateVenc", self.parametrerdateVenc);
						b.putString("temp_fin", self.parametrertemp_fin);
						b.putString("obs", self.parametrerobs);
						b.putString("numLote", proceso);
						intent.putExtra("clave", b);

						self.startActivity(intent);
						Log.e("Cehqueo_Traza",
								"el servidor me retorno true y esta en el mensaje en pantalla");

					}
				});
			} else {
				runOnUiThread(new Runnable() {
					public void run() {

						progressDialog.dismiss();
						AlertDialog.Builder mensajeEmergente = new AlertDialog.Builder(
								activity);
						mensajeEmergente.setTitle(R.string.tituloError);
						mensajeEmergente.setMessage(respStr);
						mensajeEmergente.setNeutralButton(R.string.btnAceptar,
								null);
						mensajeEmergente.create();
						mensajeEmergente.show();
						Log.e("Cehqueo_Traza",
								"el servidor no retorno true y esta en el mensaje en pantalla");
					}
				});

			}

		} catch (Exception e) {
			Log.e("Cehqueo_Traza", "me salta al catch y no termina el TRY");
			Log.e("Cehqueo_Traza", e.toString());

			progressDialog.dismiss();
			// mensaje de respuesta del servidor
			runOnUiThread(new Runnable() {
				public void run() {
					manejadorMensajes.alertMessageOneButton(activity,
							R.string.tituloError, R.string.msjERConexionEnviar,
							R.string.btnAceptar);

				}
			});
		}
		dataBase.cerrar();

	}

	@Override
	public boolean onKeyUp(int keyCode, KeyEvent event) {

		if (keyCode == KeyEvent.KEYCODE_BACK) {

			// Salir
			Intent intent = new Intent();
			intent.setClass(activity, Trazabilidad.class);
			startActivity(intent);
			return true;

		}
		// para las demas cosas, se reenvia el evento al listener habitual
		return super.onKeyUp(keyCode, event);
	}
}
